package juego;
import static java.lang.Math.*;
/**
 *
 * @author narape
 */
public class ValidadorBoggle {
    private static final int TAM_MINIMO_PALABRA = 3;
    private static final int FILAS_TABLERO = 4;
    
    public boolean validar(char[][] tablero, String palabra) {
        assert palabra != null && palabra.length() >= TAM_MINIMO_PALABRA;
        assert tablero.length == FILAS_TABLERO 
                && tablero[0].length == FILAS_TABLERO;
        
        char inicial = palabra.charAt(0);
        String restoPalabra = palabra.substring(1);
        boolean[][] letrasUtilizadas = new boolean[FILAS_TABLERO][FILAS_TABLERO];
                
        for (int i = 0; i < FILAS_TABLERO; i++) {
            for (int j = 0; j < FILAS_TABLERO; j++) {
                if (tablero[i][j] == inicial) {
                    letrasUtilizadas[i][j] = true;
                    if (validar(tablero, letrasUtilizadas, restoPalabra, i, j)) {
                        return true;
                    } else {
                        letrasUtilizadas[i][j] = false;
                    }
                }
            }            
        }
        return false;
    }

    private boolean validar(char[][] tablero, boolean[][] letrasUtilizadas, 
            String palabra, int xi, int xj) {
        if (palabra.isEmpty()) {
            return true;
        }
        
        char inicial = palabra.charAt(0);
        String restoPalabra = palabra.substring(1);
        for (int i = max(xi - 1, 0), ni = min(xi + 1, FILAS_TABLERO - 1); i <= ni; i++) {
            for (int j = max(xj - 1, 0), nj = min(xj + 1, FILAS_TABLERO - 1); j <= nj; j++) {
                char actual = tablero[i][j];
                boolean utilizado = letrasUtilizadas[i][j];
                if ((i != xi || j != xj) && actual == inicial && !utilizado) {
                    letrasUtilizadas[i][j] = true;
                    if (validar(tablero, letrasUtilizadas, restoPalabra, i, j)) {
                        return true;
                    } else {
                        letrasUtilizadas[i][j] = false;
                    }
                }
            }
        }
        
        return false;
    }    
}
